package com.atguigu.servicebase.exceptionhandler;

import com.atguigu.commonutils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @ClassName GlobalExceptionHandler
 * @Description TODO
 * @Detail 全局异常处理类
 *          配置步骤：
 *              1、全局异常
 *                  1、编写一个类，加上@ControllerAdvice
 *                  2、编写一个方法，加上 @ExceptionHandler(Exception.class) 注解，Exception代表要捕获的异常
 *              2、特定异常
 *                  步骤与全局异常差不多，但是要捕获的异常指定为特定异常，如ArithmeticException
 *              3、自定义异常
 *                  1、自定义一个异常类，继承RuntimeException
 *                      RuntimeException对代码没有侵入性
 *                  2、步骤跟全局异常差不多，但是要捕获的异常为自定义异常
 *                  3、使用自定义异常时要手动抛出，这样系统才能捕获
 *              4、日志输出配置
 *                  1、要想把日志信息输出到文件，需要使用日志根工具，如log4f、logback，本项目使用logback
 *                  2、配置logback的配置文件
 *                  3、将其他日志信息的配置删除
 *              5、异常信息输出到日志
 *                  1、在类上使用@Slf4j
 *                  2、log.error(e.getMsg());
 *                      使用该方法记录错误信息，这样可以把异常信息记录到错误日志文件
 * @Author MyPC
 * @Date 2020/6/21
 * @Version 1.0
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 全局异常处理，实际项目常用
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)  //指定能要捕获的异常类型
    @ResponseBody
    public R error(Exception e){
        e.printStackTrace();
        return R.error().message("配置了全局异常");
    }

    /**
     * 特定异常处理
     * 实际开发中用的比较少
     * @param e
     * @return
     */
    @ExceptionHandler(ArithmeticException.class)  //指定能要捕获的异常类型
    @ResponseBody
    public R error(ArithmeticException e){
        e.printStackTrace();
        return R.error().message("配置了特定异常");
    }

    /**
     * 自定义异常，实际项目常用
     * @param e
     * @return
     */
    @ExceptionHandler(GuliException.class)  //指定能要捕获的异常类型
    @ResponseBody
    public R error(GuliException e){
        //将错误日志输出到文件
        log.error(e.getMsg());
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}
